package ioExample;

// 1）扫描指定目录，并找到名称中包含指定字符的所有普通文件（不包含目录），并且后续询问用户是否要删除该文件
//思路：① 先让用户输入：要扫描的路径+你要查找的词/指定字符
//② 遍历目录，找到名字匹配的文件
//③询问用户是否删除

import java.io.File;
import java.io.IOException;
import java.util.Scanner;

public class Demo1 {
    public static void main(String[] args) throws IOException {
        // 1. 用户输入必要信息
        // 输入目录
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要扫描的路径/文件夹：");
        String rootDir = scanner.next();
        // 判断该路径/文件夹是否存在
        File dir = new File(rootDir); // 创建一个文件（夹）
        if(! dir.isDirectory()) {
            System.out.println("您输入的目录不存在！");
            return;
        }
        // 说明路径正确+输入搜索的关键词
        System.out.println("请输入要搜索的关键词：");
        String toDelete = scanner.next();

        // 2. 遍历目录进行匹配
        // 遍历目录需要借助一个核心方法listFiles():列举当前包含的子目录以及文件（只能一层）
        // 解决方法：遍历listFiles的结果，针对每个元素进行判定，看它是一个普通文件还是一个目录，
        // 如果是普通文件就直接判定是否包含了要查的关键词，如果是目录就递归的调用listFiles。
        scanDir(dir,toDelete);
    }

    // 专门写一个扫描目录的方法:递归遍历！！
    private static void scanDir(File rootDir, String toDelete) throws IOException {
        System.out.println("当前访问："+rootDir.getCanonicalPath());
        File[] files = rootDir.listFiles();
        // 拿到文件后 判断该文件数组是否为空，空就说明此时的rootDir就是一个空目录
        if(files == null) {
            return;
        }
        // 来到这儿，就说明目录非空，循环遍历里面的每个文件/文件夹就ok
        for (File file:files) {
            // 判断是否为目录，如果是目录就进行递归遍历
            if(file.isDirectory()) {
                scanDir(file,toDelete);
            } else {
                // 不是目录，即普通文件：判断是否符合要求需要删除？
                checkDelete(file,toDelete);
            }
        }
    }

    // 普通文件判断是否满足关键字需要进行删除
    // 给抛出一个异常
    private static void checkDelete(File file, String toDelete) throws IOException {
        // 判断文件名中是否包含要删除的关键字
        if(file.getName().contains(toDelete)) {
            System.out.println("该关键词"+toDelete+"被包含在"+file.getName()+"中，是否确认删除(Y/N)");
            // 用户进行输入
            Scanner in = new Scanner(System.in);
            String choice = in.next();
            // 判断输入

            // 注意：String类型比较相等如果使用==，则会一直false，因为String是引用类型，会new对象，比较的是地址！！
            // 所以：这里只会执行else！！
            /*if((choice=="Y") || (choice=="y")) {
                file.delete();  // 文件删除直接有删除函数！！！
                System.out.println("删除成功！");
            } else if ((choice=="N") || (choice=="n")) {
                System.out.println("取消删除！");
            } else {
                System.out.println("输入错误！");
            }*/

            // 修改：
            // 引用类型比较相等：equals
            if((choice.equals("Y")) || (choice.equals("y"))) {
                file.delete();  // 文件删除直接有删除函数！！！
                System.out.println("删除成功！");
            } else if ((choice.equals("N")) || (choice.equals("n"))) {
                System.out.println("取消删除！");
            } else {
                System.out.println("输入错误！");
            }
        }
    }
}
